﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Projecturo.ProjecturoClient.Test.TestData;
using Projecturo.ProjecturoClient.ViewModel;

namespace Projecturo.ProjecturoClient.Test
{
    [TestClass]
    [DeploymentItem("Configuration.xml")]
    public class ViewModelManagerTest
    {
        private TestContext testContextInstance;

        /// <summary>
        ///Ruft den Textkontext mit Informationen über
        ///den aktuellen Testlauf sowie Funktionalität für diesen auf oder legt diese fest.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Zusätzliche Testattribute
        //
        // Sie können beim Schreiben der Tests folgende zusätzliche Attribute verwenden:
        //
        // Verwenden Sie ClassInitialize, um vor Ausführung des ersten Tests in der Klasse Code auszuführen.
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Verwenden Sie ClassCleanup, um nach Ausführung aller Tests in einer Klasse Code auszuführen.
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Mit TestInitialize können Sie vor jedem einzelnen Test Code ausführen. 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Mit TestCleanup können Sie nach jedem einzelnen Test Code ausführen.
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void LoadTestViewModelByModelTypeTest()
        {
            ViewModelBase createdViewModel = ViewModelManager.Instance.CreateViewModel(typeof (TestModel));
            Assert.IsNotNull(createdViewModel);
            Assert.IsTrue(createdViewModel is TestViewModel);
        }

        [TestMethod]
        public void LoadTestViewModelByNameTest()
        {
            ViewModelBase createdViewModel = ViewModelManager.Instance.CreateViewModel("TestViewModel");
            Assert.IsNotNull(createdViewModel);
            Assert.IsTrue(createdViewModel is TestViewModel);
        }

        [TestMethod]
        public void GetViewModelTest()
        {
            ViewModelBase createdViewModel = ViewModelManager.Instance.CreateViewModel(typeof (TestModel));
            Assert.IsNotNull(createdViewModel);
            ViewModelBase gotViewModel = ViewModelManager.Instance.GetViewModel(createdViewModel.ViewModelReference.CurrentViewModelId);
            Assert.IsNotNull(gotViewModel);
            Assert.AreEqual<Guid>(createdViewModel.ViewModelReference.CurrentViewModelId,
                                  gotViewModel.ViewModelReference.CurrentViewModelId);

        }

        [TestMethod]
        public void ReleaseViewModelTest()
        {
            ViewModelBase createdViewModel = ViewModelManager.Instance.CreateViewModel(typeof (TestModel));
            Assert.IsNotNull(createdViewModel);

            ViewModelManager.Instance.ReleaseViewModel(createdViewModel.ViewModelReference.CurrentViewModelId);
            ViewModelBase releasedViewModel = ViewModelManager.Instance.GetViewModel(createdViewModel.ViewModelReference.CurrentViewModelId);
            Assert.IsNull(releasedViewModel);
        }

        [TestMethod]
        public void GetChildViewModelsTest()
        {
            ViewModelBase createdViewModel = ViewModelManager.Instance.CreateViewModel(typeof(TestModel));
            Assert.IsNotNull(createdViewModel);

            ViewModelBase createdChildViewModel = ViewModelManager.Instance.CreateViewModel(typeof(TestModel),
                                                                                            createdViewModel);
            Assert.IsNotNull(createdChildViewModel);
            Assert.AreEqual(createdViewModel.ViewModelReference.CurrentViewModelId,
                            createdChildViewModel.ViewModelReference.ParentViewModelId);
            
        }
    }
}
